<?php

namespace Illuminate\Auth;

use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\UserProvider;

/**
 * 守卫工具类
 */
trait GuardHelpers
{
    /**
     * 当前经过身份验证的用户
     *
     * @var \Illuminate\Contracts\Auth\Authenticatable
     */
    protected $user;

    /**
     * 用户提供者的实例
     *
     * @var \Illuminate\Contracts\Auth\UserProvider
     */
    protected $provider;

    /**
     * 确定当前用户是否经过身份验证。如果不是，则抛出异常
     *
     * @return \Illuminate\Contracts\Auth\Authenticatable
     *
     * @throws \Illuminate\Auth\AuthenticationException
     */
    public function authenticate()
    {
        if (!is_null($user = $this->user())) {
            return $user;
        }

        throw new AuthenticationException;
    }

    /**
     * 判断当前守卫是否已经拥有用户对象
     *
     * @return bool
     */
    public function hasUser()
    {
        return !is_null($this->user);
    }

    /**
     * 确认请求用户是否通过了身份认证
     *
     * @return bool
     */
    public function check()
    {
        return !is_null($this->user());
    }

    /**
     * 确认当前请求是否是来宾用户
     *
     * @return bool
     */
    public function guest()
    {
        return !$this->check();
    }

    /**
     * 获取当前经过身份验证的用户的 ID
     *
     * @return int|null
     */
    public function id()
    {
        if ($this->user()) {
            return $this->user()->getAuthIdentifier();
        }
    }

    /**
     * 设置用户实例
     *
     * @param  \Illuminate\Contracts\Auth\Authenticatable $user
     * @return $this
     */
    public function setUser(AuthenticatableContract $user)
    {
        $this->user = $user;

        return $this;
    }

    /**
     * 获取当前守卫的用户提供者
     *
     * @return \Illuminate\Contracts\Auth\UserProvider
     */
    public function getProvider()
    {
        return $this->provider;
    }

    /**
     * 设置当前守卫使用的用户提供者
     *
     * @param  \Illuminate\Contracts\Auth\UserProvider $provider
     * @return void
     */
    public function setProvider(UserProvider $provider)
    {
        $this->provider = $provider;
    }
}
